package top.hymsk.ecommerce.utils;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import top.hymsk.ecommerce.config.CryptoConfig;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 花于陌上开
 */
@Component
public class JwtUtils {

    static byte[] KEY;

    protected JwtUtils(@Autowired CryptoConfig cryptoConfig) {
        JwtUtils.KEY = cryptoConfig.getJwtKey().getBytes();
    }

    /**
     * 获取JWT(有效时间默认为24小时)
     *
     * @param userId 用户名
     * @return JWT字符串
     */
    public static String createJwt(Integer userId, Integer storeId) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", userId);
        claims.put("storeId", storeId);
        return Jwts.builder()
                .setClaims(claims) //设定PayLoad
                .signWith(SignatureAlgorithm.HS256, KEY) //签名算法
                .setExpiration(new Date(System.currentTimeMillis() + 24 * 3600 * 1000))  //设置有效期
                .compact();
    }

    /**
     * 获取JWT
     *
     * @param userId    用户名
     * @param validTime 有效时间
     * @return JWT字符串
     */
    public static String createJwt(Integer userId, Integer storeId, Long validTime) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", userId);
        claims.put("storeId", storeId);
        return Jwts.builder()
                .setClaims(claims) //设定PayLoad
                .signWith(SignatureAlgorithm.HS256, KEY) //签名算法
                .setExpiration(new Date(System.currentTimeMillis() + validTime))  //设置有效期
                .compact();
    }

    /**
     * 解析JWT令牌
     *
     * @param jwt JWT字符串
     * @return 解析得到的结果
     */
    public static Map<String, Object> parseJwt(String jwt) {
        return Jwts.parser()
                .setSigningKey(KEY) //指定签名秘钥
                .parseClaimsJws(jwt) //解析令牌
                .getBody();
    }
}
